import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
import { ElMessage } from 'element-plus';

// 扩展AxiosRequestConfig接口以添加自定义属性
interface CustomAxiosRequestConfig extends AxiosRequestConfig {
  _retry?: boolean;
}

// 扩展InternalAxiosRequestConfig接口以添加自定义属性
interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig {
  _retry?: boolean;
}

// 创建axios实例
const service: AxiosInstance = axios.create({
  baseURL: '/api', // 通过代理访问后端
  timeout: 15000,
  headers: {
    'Content-Type': 'application/json',
  },
  withCredentials: true, // 允许携带cookie
});

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const customConfig = config as CustomInternalAxiosRequestConfig;
    
    // 从localStorage获取主应用的token
    const token = localStorage.getItem('auth_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    
    return config;
  },
  (error) => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 直接返回响应数据
    return response.data;
  },
  (error) => {
    console.error('响应错误:', error.config?.url, error.response?.data || error.message);
    
    const { response } = error;
    
    if (response) {
      // 处理HTTP错误状态
      switch (response.status) {
        case 400:
          ElMessage.error('请求参数错误');
          break;
        case 401:
          ElMessage.error('未授权，请检查token设置');
          break;
        case 403:
          ElMessage.error('拒绝访问');
          break;
        case 404:
          ElMessage.error('请求的资源不存在');
          break;
        case 500:
          ElMessage.error('服务器错误');
          break;
        default:
          ElMessage.error(`请求失败: ${response.status}`);
      }
    } else {
      // 处理网络错误
      if (error.message.includes('timeout')) {
        ElMessage.error('请求超时');
      } else {
        ElMessage.error('网络错误，请检查您的连接');
      }
    }
    
    return Promise.reject(error);
  }
);

export default service;
